home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / kob / kob001s.lzh / xb.has < prev    next >
Encoding:
Text File  |  1997-03-08  |  41.8 KB  |  2,467 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xb.has  ……   ぺけ-BASICのコンパイラ本体(メイン)
  5. *               こ-BASICのコンパイラ本体(メイン)
  6. *
  7. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  8.  
  9.     .include    kob.h
  10.     .include    doscall.mac
  11.     .include    iocscall.mac
  12.     .include    fefunc.h
  13.     .include    variable.h
  14.  
  15.  
  16.     .xref    ko_debug
  17.     .xref    ko_dec_print
  18.     .xref    ko_hex_print
  19.     .xref    _bwp
  20.     .xref    _WindowClose
  21.     .xref    _WindowConnectionClose
  22.  
  23.     .xref    statement_check
  24.     .xref    first_check_a5
  25.     .xref    first_check_a5_in_line
  26.     .xref    行末まで飛ばし
  27.     .xref    hash
  28.     .xref    hash_label特別
  29.     .xref    make_hash_istable
  30.     .xref    stat解釈
  31.     .xref    variable_check
  32.     .xref    math解釈
  33.     .xref    function解釈
  34.     .xref    function_check
  35.     .xref    global変数リスト作成
  36.     .xref    未宣言をint_sub
  37.     .xref    system関数table作成
  38.     .xref    system変数table作成
  39.     .xref    dim_init_data
  40.     .xref    int定数get
  41.  
  42.     .xref    one_check
  43.     .xref    型get
  44.     .xref    型getS
  45.     .xref    名前登録
  46.     .xref    label_sub
  47.  
  48.     .xref    If_end
  49.     .xref    Else
  50.     .xref    else_check
  51.  
  52.  
  53.  
  54.     .text
  55.     .even
  56.     .xdef    _kobas_init
  57. _kobas_init:
  58.     movem.l    4(sp),d2/a2        * argc/argv
  59.     movem.l    d3-d7/a3-a6,-(sp)
  60.  
  61.     move.l    #_WORK,d3
  62.     move.l    #$c0_0000,-(sp)
  63.     DOS    _MALLOC
  64.     andi.l    #$ff_fff0,d0
  65.     cmp.l    d3,d0
  66.     bcs    mem_err0
  67.     move.l    d0,d1        * メモリ確保量
  68.     move.l    d0,(sp)
  69.     DOS    _MALLOC        * メモリ最大確保(後でSETBLOCKでサイズ再調整)
  70.     addq.l    #4,sp
  71.  
  72.     movea.l    d0,a6
  73.     move.l    sp,SP_kobas_init    * エラーなどで途中で抜ける時のため
  74.     lea.l    a6保存(pc),a1
  75.     move.l    d0,(a1)        * 基本ワーク先頭(不変)
  76.  
  77.     add.l    d3,d0
  78.     movea.l    d0,a4        * 基本ワークの次のアドレス
  79.     add.l    a6,d1
  80.     move.l    d1,mem_last    * 現在のワーク全体の末尾アドレス
  81.  
  82.  
  83.  
  84.  * コンパイル用変数の初期化処理
  85.  
  86.     moveq    #0,d7            * フラグリセット
  87.     moveq    #-1,d0
  88.  
  89.     movem.l    d2/a2,b_argc        * 引き数列(とりあえず)
  90.     move.l    d7,errorno
  91.     move.l    d7,行数
  92.     move.w    d7,EXITcode
  93.     move.w    d7,fkeyflag
  94.     move.b    d7,sinitFLAG
  95.     move.w    d0,関数file数
  96.     move.w    d0,breakcheck
  97.     move.w    d0,tagFP
  98.     movem.l    d0/d7,EXTENDmask    * OFFmask/ONmask
  99.     move.w    #1,xb動作mode        * kobas_init 呼び出し中
  100.     move.b    d0,global_flag
  101.  
  102.     move.w    d7,_FREEMEM(a6)
  103.     move.b    d7,cnf_filename
  104.  
  105.  
  106.  
  107.     pea.l    起動dir
  108.     move.l    (a2)+,-(sp)        * argv[0] : 起動されたドライブ+パス名+コマンド名
  109.     DOS    _NAMECK
  110.     addq.l    #8,sp
  111.     bsr    com_est
  112.  
  113.     bsr    make_hash_istable    * ハッシュ値計算高速化のためのテーブル作成
  114.  
  115.  
  116. **    **    **    **    **    **    初期化終了
  117.  
  118.     move.w    #-1,関数file数
  119.  * kob.cnf を読み込む。
  120.     bsr    cnf_read
  121.  
  122.     movem.l    EXTENDmask,d0/d1
  123.     and.l    d0,d7        * OFFmask
  124.     or.l    d1,d7        * ONmask
  125.  
  126.     clr.l    行数
  127.  
  128.  
  129.  
  130.  * 外部関数を読み込んで、ハッシュ値順に並べ直す
  131.     bsr    func_read
  132.  
  133.  
  134.     move.l    a4,strbuf
  135.     adda.l    #strbufSIZE,a4
  136.  
  137.     move.l    a4,nest_work
  138.     adda.l    #nest_workSIZE,a4
  139.  
  140.     move.l    a4,program_area
  141.  
  142.  
  143.  
  144.  * フリーエリア指定サイズ確保
  145.     moveq    #0,d0
  146.     move.w    _FREEMEM(a6),d0
  147.     bne    @f
  148.     move.w    #$100,d0    * default
  149. @@:
  150.     moveq    #10,d1
  151.     lsl.l    d1,d0        * 1K 倍
  152.  
  153.     lea.l    (a4,d0.l),a1
  154.     cmpa.l    mem_last,a1
  155.     bhi    mem_err1
  156.     move.l    a4,MEM1
  157.     move.l    a1,MEM2
  158.     move.l    a1,mem_last
  159.  
  160.     suba.l    a6,a1
  161.     move.l    a1,-(sp)
  162.     move.l    a6,-(sp)
  163.     DOS    _SETBLOCK
  164.     addq.l    #8,sp
  165.  
  166.  
  167.  
  168.  
  169.     bsr    system関数table作成
  170.     bsr    system変数table作成
  171.  
  172.  
  173.  
  174.  
  175.  
  176. **    **    **    **    **    **
  177. *    .xdef    restart
  178. *restart:
  179.     move.l    MEM2,mem_last
  180.     clr.w    EXITcode
  181.     bclr    #warningF,d7
  182.     bclr    #modeF,d7
  183.  
  184.  
  185.  * BASICのファイルを読み込む
  186.     lea.l    basic_filename,a2
  187.     clr.w    -(sp)
  188.     move.l    a2,-(sp)
  189.     DOS    _OPEN
  190.     tst.l    d0
  191.     bge    1f
  192.  
  193. @@:
  194.     tst.b    (a2)+
  195.     bne    @b
  196.     move.b    #'.',-1(a2)
  197.     move.b    #'k',(a2)+
  198.     move.b    #'o',(a2)+
  199.     move.b    #'b',(a2)+
  200.     clr.b    (a2)
  201.     DOS    _OPEN
  202.     tst.l    d0
  203.     bmi    help
  204. 1:
  205.  
  206.     move.l    program_area,a5
  207.     move.l    mem_last,d1
  208.     sub.l    a5,d1
  209.     bcs    mem_err
  210.     move.l    d1,-(sp)
  211. *    move.l    a5,-(sp)
  212.     pea.l    1(a5)        * 行番号対策など
  213.     move.w    d0,-(sp)
  214.     DOS    _READ
  215.     lea.l    1(a5,d0.l),a2        * last address
  216.     clr.b    (a2)
  217.     addq.l    #1+1+3,d0
  218.     andi.b    #$fc,d0
  219.     lea.l    (a5,d0.l),a4
  220.     cmp.l    d1,d0
  221.     bcc    mem_err
  222.     DOS    _CLOSE
  223.     lea.l    16(sp),sp
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  * ベーシック内部で使用する変数の初期化
  230.  
  231.     moveq    #-1,d0        * 登録された個数 - 1
  232.     move.w    d0,4+変数int
  233.     move.w    d0,4+変数str
  234.     move.w    d0,4+変数char
  235.     move.w    d0,4+変数float
  236.     move.w    d0,4+配列
  237.  
  238.     move.w    d0,8+中間言語行数
  239.     move.w    d0,8+変数INIT
  240.     move.w    d0,8+引数INIT
  241.     move.w    d0,8+行番号
  242.     move.w    d0,8+ラベル
  243.     move.w    d0,8+goto飛先
  244.  
  245.     movea.l    nest_work,a0
  246.     clr.l    (a0)+
  247.  
  248.     clr.w    4+名前
  249.  
  250.     bsr    内部関数
  251.  
  252.  
  253.     move.l    a4,中間言語
  254.     move.l    a4,$c+中間言語行数
  255.  
  256.  
  257.  
  258.  
  259.     move.l    program_area,a5
  260.     addq.l    #1,a5
  261.  
  262.     bset    #no_cnfF,d7
  263.  
  264.     bsr    first_check_a5_in_line
  265.     tst.w    d0
  266.     bne    @f
  267.     bset    #linenumF,d7        *行番号あり
  268. @@:
  269.  
  270.     move.b    #$a,-(a5)        * 行番号対策など
  271.     clr.l    行数
  272.  
  273.  
  274.  
  275.  * グローバル関数ブロックの冒頭処理
  276. *    movem.l    変数INIT,d0/d1
  277. *    sub.l    d1,d0
  278. *    move.w    d0,(a4)+    * 変数 area を初期化する時の参照するオフセット
  279. *    movem.l    引数INIT,d0/d1
  280. *    sub.l    d1,d0
  281. *    move.w    d0,(a4)+    * 引き数を取り込む時、参照するオフセット
  282.     clr.l    (a4)+        * 最初だから……
  283.  
  284. *    btst    #b_argF,d7
  285. *    beq    @f
  286.  
  287.     .xref    b_argc_def
  288.     bsr    b_argc_def
  289.  
  290.     pea.l    引数INIT    * デフォルトで引き数を取り込む
  291.     moveq    #1,d0        * 引き数の個数 - 1   ( b_argc;int , b_argv();str )
  292.     bsr    buf書込        * d1.w/a0-a1 破壊
  293.     move.w    #$8000,d0    * int
  294.     bsr    buf書込
  295.     moveq    #0,d0        * b_argc #
  296.     bsr    buf書込
  297.     moveq    #0,d0        * dim (1-dimensinal)  +  b_argv() #
  298.     bsr    buf書込L
  299.     addq.l    #4,sp
  300.  
  301.  
  302.  * コンパイラ・メインルーチンの始まり始まり
  303. 解釈ループ0:
  304.     lea.l    $100(a4),a0    * チェックのためのちょっと余裕
  305.     cmpa.l    mem_last,a0
  306.     bcc    mem_err
  307.  
  308.  * a5 から調べ始める。
  309.  * まず、空白(9,10,13,32)を飛ばして、先頭の文字を見る。
  310.  * '/'か(注釈の可能性大)、その他か(プログラムの本文か)
  311.     bsr    first_check_a5
  312.  * 数字なら    d0 = 0
  313.  * プログラム終了なら        d0 = -1
  314.  * その他なら            d0 = そのキャラクタ
  315.     tst.w    d0
  316.     bmi    end
  317.     beq    bunpo_err
  318.  
  319.  
  320.     cmpi.b    #'}',d0
  321.     beq    if_block
  322.     cmpi.b    #'?',d0        * print省略形
  323.     bhi    文解釈
  324.     beq    print省略形
  325.     cmpi.b    #'*',d0
  326.     beq    label_star
  327.     cmpi.b    #'/',d0        * remark
  328.     bne    文解釈
  329.     cmpi.b    #'*',1(a5)
  330.     bne    文解釈
  331.     bsr    行末まで飛ばし    * 注釈だ
  332.     bra    解釈ループ0
  333.  
  334. print省略形:
  335.     addq.l    #1,a5
  336.     moveq    #5,d0        * 'print'$$$
  337.     bra    stat22
  338.  
  339. label_star:
  340.     addq.l    #1,a5
  341.     bsr    hash
  342.     bsr    @f
  343.     bra    解釈ループ
  344. label_quote:
  345.     cmpi.b    #'"',(a5)+
  346.     bne    label_quote_err
  347.     bsr    hash_label特別
  348.     bsr    @f
  349.     cmpi.b    #'"',(a5)+
  350.     bne    label_quote_err
  351.     bra    解釈ループ
  352. @@:
  353.     bsr    label_sub    * d0 = label #
  354.     move.l    d0,d1
  355.     lsl.w    #3,d1
  356.     addq.w    #4,d1        * 行数の格納位置
  357.     movea.l    4+ラベル,a3
  358.     bsr    bufgetL
  359.     addq.l    #1,d0
  360.     bne    ラベル二重定義
  361.     move.l    a4,d2        * address
  362.     bsr    bufputL
  363.     rts
  364. ラベル二重定義:
  365.     ERRORS    81
  366. label_quote_err:
  367.     ERROR    82
  368.  
  369. if_block:
  370.     addq.l    #1,a5
  371. ifb2:
  372.     movea.l    nest_work,a0
  373.     tst.l    (a0)
  374.     beq    block_err
  375.     cmpi.w    #3,8(a0)
  376.     bne    block_err
  377.  
  378.     move.w    10(a0),d0        * if_flag (0/1/2/3)
  379.     btst    #0,d0            * block?
  380.     bne    ifb1
  381.  
  382.     bsr    If_end        * if 文で、改行終わりの時
  383.     bra    ifb2        * もう一個上にある「はず」
  384.  
  385. ifb1:
  386.     btst    #1,d0            * then/else
  387.     bne    ifb3
  388.  
  389.     bsr    else_check
  390.     bne    ifb3
  391.     addq.l    #4,a5
  392.  
  393.     movea.l    nest_work,a0
  394.     clr.w    10(a0)        * if_flag ( 0 = '{'のない/'}'で閉じた後の then ) (H8/2/1)
  395.     bsr    Else
  396.     addq.l    #1,a5        * ':' ごたごたしてるけど、とりあえず
  397.     bra    解釈ループ0        * すぐ文
  398.  
  399.  
  400. ifb3:
  401.     bsr    If_end        * if 文で、ブロック終わりの時
  402.     bra    解釈ループ
  403.  
  404. block_err:
  405.     ERROR    31
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412. 文解釈:
  413.  * 最初の対象を見つけたので
  414.  * これからハッシュ値を計算しながら、文字数を数えさせる
  415.     bsr    hash
  416.  * a2.l = 元の対象の開始アドレス
  417.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  418.  * d4.l = (hash.w)(文字数-1)
  419.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  420.     tst.w    d4
  421.     bmi    bunpo_err
  422.  
  423.  
  424.  
  425.  * 対象がどれかステートメントと一致するかどうか
  426.  * a2.l = 元の対象の開始アドレス
  427.  * d5.w = ハッシュ値
  428.  * d4.w = 文字数 - 1
  429.     bsr    statement_check
  430.  * 一致すれば        d0 = そのステートメント番号
  431.  * 一致しなければ    d0 = 0
  432.  
  433. stat22:
  434.     tst.w    d0
  435.     beq    ステートメントでない
  436.     cmpi.w    #$2a,d0        * 'label'
  437.     beq    label_quote
  438.  
  439.  * 各ステートメントごとに文法が違うのでいちいち異なる解釈をしなければ
  440.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  441.     bsr    stat解釈
  442.     bra    解釈ループ
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459. ステートメントでない:
  460.  
  461.  
  462.  * 関数かどうかチェックする
  463.     cmpi.b    #'(',d1
  464.     bne    変数かどうかチェック
  465.  
  466.  
  467.  *         d4.l = * (hash.w)(文字数-1)
  468.  *         a2.l = 元の対象の開始アドレス
  469.     bsr    function_check
  470.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  471.  *    = $8000  float
  472.  *    = $8001  int
  473.  *    = $8003  str
  474.  *    = $ffff  void
  475.  * d0.w < 0 の時
  476.  *    d1.w = 引き数の個数
  477.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  478.  *    a2   = パラメーターテーブル
  479.     tst.w    d0
  480.     beq    変数かどうかチェック
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  * 関数の処理
  488.     clr.w    (a4)+        * 中間言語書き込み
  489.     movea.l    a4,a3
  490.  * 関数の解釈
  491.  * input    a2   = パラメーターテーブル
  492.  *        a3   = 書き込み先アドレス
  493.  *        d1.w = 引き数の個数
  494.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  495.     bsr    function解釈
  496.  *        d0   = 書き込んだ長さ
  497.     add.l    d0,a4
  498.  
  499.     bra    解釈ループ
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508. 変数かどうかチェック:
  509.  
  510.  *         d4.l = * (hash.w)(文字数-1)
  511.  *         a2.l = 元の対象の開始アドレス
  512.      bsr    variable_check
  513.  * 重なってない        d2.l    = -1
  514.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  515.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  516.  * char の n 番と一致    d2.l    = n+0200
  517.  * float の n 番と一致    d2.l    = n+8000
  518.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  519.  * d0 =   0 : 普通の変数
  520.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  521.  *    $80 : auto 変数
  522.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  523.  *     -1 : 当たりなし
  524.     bmi    misengen
  525.     tst.l    d2
  526.     bmi    sysに代入
  527.  
  528.     bclr    #7,d0
  529.     beq    @f
  530.     swap    d2
  531.     not.w    d2        * AUTO 変数
  532.     swap    d2
  533. @@:
  534.  
  535.     tst.w    d0
  536.     beq    配列以外に代入
  537. *    beq    普通の変数に代入
  538.  * 配列に代入
  539.  
  540.     cmpi.b    #'(',(a5)
  541.     bne    dim_init
  542.  
  543.     move.l    d2,-(sp)    * 式の型・保存
  544.     moveq    #0,d0        * 添え字書き込みサイズ
  545.     move.w    $a(a0),d1    * 次元 - 1
  546.     lea.l    tmp,a3
  547. @@:
  548.     addq.l    #1,a5
  549.     movem.l    d0/d1,-(sp)
  550.     moveq    #0,d2        * 添え字は整数だ
  551.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  552.  * int        d2.w    = 0000
  553.     bsr    math解釈
  554.     add.l    (sp)+,d0
  555.     move.l    (sp)+,d1
  556.  
  557.     cmpi.b    #',',(a5)
  558.     dbne    d1,@b
  559.     beq    添え字の個数が多い
  560.     tst.w    d1
  561.     bne    添え字の個数が少ない
  562.     cmpi.b    #')',(a5)+
  563.     bne    bunpo_err
  564.  
  565.     move.l    (sp)+,d2
  566.     bra    普通の変数に代入
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  573.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  574. sysに代入:
  575.     tst.w    d2
  576.     beq    int_sysに代入
  577.     swap    d2
  578.     addq.w    #1,d2
  579.     beq    set_date
  580.     addq.w    #2,d2
  581.     beq    set_time
  582. @@:
  583.     ERRORS    58        * date$, time$ 以外に代入
  584.  
  585.  
  586. int_sysに代入:
  587.     swap    d2
  588.     neg.w    d2
  589. *    cmpi.w    #-9,d2        * システム変数 IntervalTIME か?
  590. *    bne    @b
  591.     subi.w    #9,d2        * システム変数 ITIME(9) or info_??(~10)
  592.     blt    @b                        * H8/11/11
  593.     move.w    #48*2,(a4)+        * statement $$$ 'ItSet'
  594.     move.w    d2,-(sp)        * 入力するシステム変数の種類
  595.  
  596.     swap    d2        * d2.w = $0000(int)
  597.  
  598.     bsr    first_check_a5_in_line        *
  599.     cmpi.b    #'=',(a5)+
  600.     bne    bunpo_err
  601.  
  602.     movea.l    a4,a3
  603.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  604.     bsr    math解釈
  605.     movea.l    a3,a4
  606.     move.w    (sp)+,(a4)+        * 入力するシステム変数の種類
  607.     bra    解釈ループ
  608.  
  609.  
  610. set_date:
  611.     clr.w    -(sp)
  612.     bra    @f
  613. set_time:
  614.     move.w    #1,-(sp)
  615. @@:
  616.     move.w    #41*2,(a4)+        * statement $$$ 'SysVar' 
  617.     swap    d2        * d2.w = $0100
  618.  
  619.     bsr    first_check_a5_in_line        *
  620.     cmpi.b    #'=',(a5)+
  621.     bne    bunpo_err
  622.  
  623.     movea.l    a4,a3
  624.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  625.  * str        d2.w    = 0100
  626.     bsr    math解釈
  627.     movea.l    a3,a4
  628.     move.w    (sp)+,(a4)+
  629.     bra    解釈ループ
  630.  
  631.  
  632. 配列以外に代入:
  633.     cmpi.b    #'[',(a5)
  634.     beq    文字列の途中への代入
  635.  
  636. 普通の変数に代入:
  637.     move.l    d0,-(sp)    * 普通の変数になら 0.w
  638.                 * 配列,a[i] になら今 tmp 上にある添え字式の長さ ( >0 )
  639.  
  640.     bsr    first_check_a5_in_line        *
  641.     cmpi.b    #'=',(a5)+
  642.     bne    bunpo_err
  643.  
  644. *    movea.l    a4,a3
  645.     lea.l    2(a4),a3
  646.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  647.  * int        d2.w    = 0000
  648.  * str        d2.w    = 0100
  649.  * char     d2.w    = 0200
  650.  * float    d2.w    = 8000
  651.  * 型未判明    d2.w    = ffff
  652.     bsr    math解釈
  653.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  654.  
  655.     lsr.w    #8,d6
  656.     bset    #15,d6        * 代入式の印、下位バイトは変数の型
  657.     move.l    (sp)+,d1
  658.     tst.w    d1        * あやしいから
  659.     beq    普通変数代入用中間言語
  660.  
  661.  
  662.  * 配列代入用中間言語
  663.     bset    #14,d6        * 配列の印
  664.     move.w    d6,(a4)+        * 中間言語書き込み
  665.     add.l    d0,a4
  666.     swap    d6        * 配列番号
  667.     move.w    d6,(a4)+        * 中間言語書き込み
  668.  
  669.     lsr.w    #1,d1
  670.     subq.w    #1,d1
  671.     bcs    sonnahazuhanai
  672.     lea.l    tmp,a0        * 添え字の式
  673. @@:
  674.     move.w    (a0)+,(a4)+
  675.     dbra    d1,@b
  676.     bra    解釈ループ
  677.  
  678.  
  679. 普通変数代入用中間言語:
  680.     move.w    d6,(a4)+        * 中間言語書き込み
  681.     add.l    d0,a4
  682.     swap    d6        * 変数番号
  683.     move.w    d6,(a4)+        * 中間言語書き込み
  684.     bra    解釈ループ
  685.  
  686.  
  687.  
  688.  
  689. 文字列の途中への代入:
  690.  * 文字列の途中 a[i]への代入
  691.  
  692.     move.w    #38*2,(a4)+        * statement $$$ 'STR' 
  693.     move.l    d2,-(sp)
  694.  
  695.     addq.l    #1,a5
  696.     moveq    #0,d2        * 添え字は整数だ
  697.  
  698.     movea.l    a4,a3
  699.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  700.  * int        d2.w    = 0000
  701.     bsr    math解釈
  702.  
  703.     cmpi.b    #']',(a5)+
  704.     bne    bunpo_err
  705.     bsr    first_check_a5_in_line
  706.     cmpi.b    #'=',(a5)+
  707.     bne    bunpo_err
  708.  
  709.     move.w    #$0200,d2    * char 型。
  710.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  711.  * char     d2.w    = 0200
  712.  * 型未判明    d2.w    = ffff
  713.     bsr    math解釈
  714.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  715.     movea.l    a3,a4
  716.     move.l    (sp)+,d2    * 上位ワードは文字列変数番号
  717.  
  718.     swap    d2        * 変数番号
  719.     move.w    d2,(a4)+        * 中間言語書き込み
  720.     bra    解釈ループ
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730. dim_init:
  731.     bsr    first_check_a5_in_line
  732.     cmpi.b    #'=',d0
  733.     bne    bunpo_err
  734.  
  735.     lea.l    $a(a0),a0
  736.     move.w    (a0)+,d3
  737.     moveq    #1,d0
  738.     moveq    #0,d1
  739. @@:
  740.     move.w    (a0)+,d1
  741.     addq.l    #1,d1
  742.     FPACK    __UMUL
  743.     dbra    d3,@b
  744.     move.l    d0,d1
  745.  
  746.  * 初期化データ
  747.  *    d3 = 型
  748.  *    d2 = 配列番号
  749.  *    d1 = 添え字大きさ
  750.     move.w    d2,d3
  751.     lsr.w    #8,d3
  752.     swap    d2
  753.     bsr    dim_init_data
  754.     *bra    解釈ループ
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761. 解釈ループ:
  762.     bsr    first_check_a5_in_line
  763.     bmi    解釈ループ0    * 改行文字だ
  764.     cmpi.b    #':',d0
  765.     beq    コロン
  766.     cmpi.b    #'}',d0        * 'if' block end
  767.     beq    解釈ループ0
  768.  
  769.     cmpi.b    #'/',d0        * 注釈
  770.     bne    @f
  771.     cmpi.b    #'*',1(a5)
  772.     beq    解釈ループ0
  773. @@:
  774.  
  775.     bsr    else_check    * else の可能性あり
  776.     bne    bunpo_err
  777.     bra    解釈ループ0
  778.  
  779. コロン:
  780.     addq.l    #1,a5
  781.     bra    解釈ループ0
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  * 未宣言変数への代入があれば、警告を出して整数型に勝手に宣言する
  791. 未宣言をint:
  792.     bsr    未宣言をint_sub
  793.     moveq    #0,d0        * 普通の変数に代入につなぐため必要
  794.     bra    普通の変数に代入
  795.  
  796.  
  797.     .xdef    misengen
  798. misengen:
  799.     cmpi.b    #'=',(a5)
  800.     beq    未宣言をint
  801.     cmpi.b    #'(',(a5)
  802.     bne    misengen_var
  803.     ERRORS    34
  804. bunpo_err:
  805.     ERROR    4
  806. misengen_var:
  807.     ERRORS    7
  808. sonnahazuhanai:
  809.     ERROR    2
  810. 添え字の個数が少ない:
  811.     ERROR    56
  812. 添え字の個数が多い:
  813.     ERROR    57
  814.  
  815.  
  816.  
  817.  
  818.     * メイン・関数ブロック終了時の処理
  819. end:
  820.     tst.b    d7        * global/auto
  821.     bmi    内部関数あり
  822.  
  823.  * global
  824.     movea.l    nest_work,a0
  825.     tst.l    (a0)
  826.     bne    nest_structure終わってない
  827.  
  828.     move.w    #$0013*2,(a4)+    * 'end'$$$
  829.     bsr    global変数リスト作成
  830.     bra    @f
  831.  
  832. 内部関数あり:
  833.     bclr    #endfuncF,d7
  834.     beq    no_endfunc
  835. @@:
  836.  
  837.  
  838.     move.l    a4,変数area
  839.     .xref    Goto整理
  840.     bsr    Goto整理
  841.  
  842.  * 中間言語にコンパイルするのが終わった
  843.  
  844.  
  845.  
  846.  
  847.  * 変数・引数INIT が連結でなかったら、つなぐ
  848.     lea.l    変数INIT,a1
  849.     bsr    chain連結
  850.     lea.l    引数INIT,a1
  851.     bsr    chain連結
  852.  
  853.  
  854. .if 0    *** ワーニング発生チェックは、こBでは無用(有害?) ***
  855.     btst    #warningF,d7
  856.     beq    @f
  857.     pea.l    _warning発生(pc)
  858.     bsr    YorN
  859.     addq.l    #4,sp
  860.     beq    @f
  861.     move.w    #1,EXITcode
  862.     bra    endendend
  863. @@:
  864. .endif    ********************************************************
  865.  
  866.     moveq    #Finit,d1
  867.     bsr    Fルーチン
  868.     moveq    #Frun,d1
  869.     bsr    Fルーチン
  870.     bset    #0,global_flag        * Finit通った
  871.  
  872.  
  873.     clr.l    行数
  874.  
  875.     bclr    #modeF,d7        * global mode
  876.     clr.w    scroll開始行
  877.  
  878.     move.l    d7,xbFLAG
  879.     movem.l    (sp)+,d3-d7/a3-a6
  880.     moveq.l    #0,d0
  881.     rts
  882.  
  883.  
  884. _kobas_init_err:
  885.     move.l    SP_kobas_init,sp    * エラーなどで途中で抜ける時のため
  886.     movem.l    (sp)+,d3-d7/a3-a6
  887.     moveq    #-1,d0
  888.     rts
  889. SP_kobas_init:
  890.     .dc.l    0
  891.  
  892.  
  893.     .xdef    _kobas_exit
  894. _kobas_exit:
  895.     move.l    a6保存(pc),d0
  896.     ble    exit_ret
  897.  
  898.     move.l    a6,-(sp)
  899.     movea.l    d0,a6
  900.  
  901.     movem.l    d3/a3,-(sp)
  902.     moveq.l    #WINMAX-1,d3
  903.     lea.l    _bwp,a3
  904. 1:
  905.     move.l    (a3)+,-(sp)
  906.     beq    @f
  907.         bsr    _WindowClose
  908.         clr.l    -4(a3)
  909. @@:
  910.     addq.l    #4,sp
  911.     dbra    d3,1b
  912.     movem.l    (sp)+,d3/a3
  913.  
  914.     bclr    #0,global_flag
  915.     beq    @f
  916.     *    KOP    '* 外部関数後始末 *',0
  917.     moveq    #Fend,d1
  918.     bsr    Fルーチン
  919.     moveq    #Fexit,d1
  920.     bsr    Fルーチン
  921. @@:
  922.  
  923.     move.l    a6,-(sp)
  924.     DOS    _MFREE
  925.     addq.l    #4,sp
  926.     lea.l    a6保存(pc),a2
  927.     clr.l    (a2)
  928.  
  929.     move.l    (sp)+,a6
  930.  
  931. exit_ret:
  932.     bsr    _WindowConnectionClose
  933.     rts
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  * 処理に息詰まったらここに飛んでくるので、
  947.  * 'xb動作mode'の内容に応じて、元の関数の終了処理に戻してやる。
  948.     .xref    _kob_driven_err        * 0
  949.     *.xref    _kobas_init_err        * 1
  950.     .xref    _kob_exec_err        * -1
  951.     .xdef    endendend
  952. endendend:
  953.     movea.l    a6保存(pc),a6
  954.     tst.w    xb動作mode
  955.     beq    _kob_driven_err
  956.     bmi    _kob_exec_err
  957.     bge    _kobas_init_err
  958.  
  959.  
  960. help:
  961.     move.w    help抑制する(pc),d0
  962.     bne    endendend
  963.     pea.l    _TITLE(pc)
  964.     KO_PRINT
  965.     pea.l    _HELP(pc)
  966.     KO_PRINT
  967.     addq.l    #8,sp
  968.     bra    endendend
  969. help抑制する:
  970.     .dc.w    0
  971.  
  972.  
  973. mem_err0:
  974.     pea.l    1+errmes(pc)    * とにかく全然メモリが確保出来なかった
  975.     KO_PRINT
  976.     addq.l    #4+4,sp        * MALLOC の時のも合わせて
  977.     movem.l    (sp)+,d3-d7/a3-a6
  978.     moveq    #0,d0        * 異常終了
  979.     rts
  980.  
  981. mem_err1:
  982.     move.w    #-1,関数file数
  983.     ERROR    0
  984. mem_err:
  985.     ERROR    1
  986. nest_structure終わってない:
  987.     ERROR    42
  988. no_endfunc:
  989.     ERROR    43
  990.  
  991.  
  992.  
  993.  
  994. kobcnf_file:
  995.     .dc.b    'kob.cnf',0
  996. _TITLE:
  997.     .dc.b    $1b,'[1m こBASIC',$1b,'[m ver.0.01 ( H9/3/7 版 )   (c)v914AKSTN.',13,10,0
  998. _HELP:
  999. *    .dc.b    'とりあえずベーシックのファイル名を指定して実験',13,10
  1000.     .dc.b    '使用方 : kob.win [-option] BASICファイル名(.kob)',13,10
  1001.     .dc.b    9,'-f<数字> : フリーエリアの大きさの指定 ( Kb 単位 )',13,10
  1002.     .dc.b    9,'-c<名前> : コンフィグファイル名の指定',13,10
  1003.     .dc.b    9,'-e<文字> : 拡張機能の ON/OFF',13,10
  1004.     .dc.b    0
  1005.     .even
  1006.  
  1007.  
  1008.  
  1009.  
  1010.     .xdef    a6保存
  1011. a6保存:
  1012.     .dc.l    0
  1013.  
  1014.  
  1015. **    **    **    **    **    **    **    **    **    **
  1016.  
  1017.     .xdef    errors
  1018.     .xdef    error
  1019.     .xdef    warnings
  1020.     .xdef    warning
  1021. errors:
  1022.     bsr    errors_sub
  1023.     bra    @f
  1024. error:
  1025.     bsr    error_sub
  1026. @@:
  1027.     move.w    #1,EXITcode
  1028.     bra    endendend
  1029. warnings:
  1030.     btst    #warnoffF,d7
  1031.     bne    warnend
  1032.     movem.l    d0-d2/d4/a0-a4,-(sp)
  1033.     pea.l    _warning(pc)
  1034.     KO_PRINT
  1035.     addq.l    #4,sp
  1036.     move.l    (sp),d0        * error #
  1037.     bsr    errors_sub
  1038.     bra    @f
  1039. warning:
  1040.     btst    #warnoffF,d7
  1041.     bne    warnend
  1042.     movem.l    d0-d2/d4/a0-a4,-(sp)
  1043.     pea.l    _warning(pc)
  1044.     KO_PRINT
  1045.     addq.l    #4,sp
  1046.     move.l    (sp),d0        * error #
  1047.     bsr    error_sub
  1048. @@:
  1049.     movem.l    (sp)+,d0-d2/d4/a0-a4
  1050.     bset    #warningF,d7
  1051. warnend:
  1052.     rts
  1053.  
  1054.  
  1055.     .xdef    errors_sub    * インタプリタ側からの直接呼び出し用
  1056.     .xdef    error_sub    * (スタック調整のための苦肉の策)
  1057. errors_sub:
  1058.     move.w    d0,-(sp)
  1059.     lea.l    tmp,a0
  1060.     move.l    a0,-(sp)
  1061.     move.b    #$27,(a0)+
  1062. @@:
  1063.     move.b    (a2)+,(a0)+
  1064.     dbra    d4,@b
  1065.     move.b    #$27,(a0)+
  1066.     move.b    #' ',(a0)+
  1067.     clr.b    (a0)
  1068.     KO_PRINT
  1069.     addq.l    #4,sp
  1070.     move.w    (sp)+,d0
  1071.     bra    1f
  1072. error_sub:
  1073.     clr.b    tmp
  1074. 1:
  1075.     lea.l    errmes(pc),a1
  1076. @@:
  1077.     tst.b    (a1)+
  1078.     bne    @b
  1079.     dbra    d0,@b
  1080.     move.l    a1,-(sp)    * error message
  1081.     KO_PRINT
  1082.     addq.l    #4,sp
  1083.  
  1084.     lea.l    $100+tmp,a0    * tag file に書き出す文字列
  1085.     move.b    #$09,(a0)+
  1086.  
  1087.  
  1088.     move.l    行数,d1
  1089.     beq    4f        * 行数に関係ないエラー
  1090.  
  1091.     pea.l    tenten(pc)
  1092.     KO_PRINT
  1093.     move.l    d1,(sp)        * 行数表示
  1094.     bsr    dec_print
  1095.     pea.l    gyou(pc)
  1096.     KO_PRINT
  1097.     addq.l    #8,sp
  1098.  
  1099.     move.l    d1,d0        * tag file
  1100.     moveq    #6,d1
  1101.     FPACK    __IUSING
  1102.     move.b    #' ',(a0)+
  1103.     move.b    #':',(a0)+
  1104.     move.b    #' ',(a0)+
  1105.     lea.l    tmp,a2        * 変数名などの情報
  1106. @@:
  1107.     move.b    (a2)+,(a0)+
  1108.     bne    @b
  1109.     subq.l    #1,a0
  1110. 4:
  1111.     pea.l    crlf(pc)
  1112.     KO_PRINT
  1113.     addq.l    #4,sp
  1114.     rts
  1115.  
  1116.  
  1117.  
  1118.     .xdef    YorN
  1119. YorN:
  1120.     move.l    4(sp),-(sp)
  1121.     KO_PRINT
  1122.     pea.l    _YorN(pc)
  1123.     KO_PRINT
  1124.     addq.l    #8,sp
  1125.     DOS    _GETCHAR
  1126.     move.w    d0,-(sp)
  1127.     pea.l    crlf(pc)
  1128.     KO_PRINT
  1129.     addq.l    #4,sp
  1130.     moveq    #$20,d0
  1131.     or.w    (sp)+,d0
  1132.     cmpi.b    #'y',d0
  1133.     rts
  1134.  
  1135. _YorN:
  1136.     .dc.b    ' ( Y or N )',0
  1137.  
  1138. _warning発生:
  1139.     .dc.b    'ワーニングがありますが、プログラムを実行しますか?',0
  1140. _初期化するか:
  1141.     .dc.b    '画面を初期化しますか?',0
  1142.  
  1143. _warning:
  1144.     .dc.b    'Warning : ',0
  1145. tenten:
  1146.     .dc.b    ' ……',0
  1147. gyou:
  1148.     .dc.b    '行目',0
  1149. crlf:
  1150.     .dc.b    13,10,0
  1151.  
  1152.  
  1153. errmes:    .dc.b    0
  1154. e00:    .dc.b    'メモリを確保出来ませんでした',13,10,0
  1155. e01:    .dc.b    'フリーエリアが足りませんです',0
  1156. e02:    .dc.b    'ぺけBにバグ有り',0
  1157. e03:    .dc.b    'そのステートメントは未サポートだ',0
  1158. e04:    .dc.b    '文法エラー',0
  1159. e05:    .dc.b    '変数の宣言が変である',0
  1160. e06:    .dc.b    '二重に宣言するなんて',0
  1161. e07:    .dc.b    'そいつは未宣言の変数だろう',0
  1162. e08:    .dc.b    'スタックがあふれました',0
  1163. e09:    .dc.b    '変な式だな',0
  1164. e10:    .dc.b    'そのステートメントはまだ実行出来ない',0
  1165. e11:    .dc.b    'dim 無しで配列宣言しましたね',0
  1166. e12:    .dc.b    '行番号がここだけないです',0
  1167. e13:    .dc.b    '先頭が数字だとややこしいですよ',0
  1168. e14:    .dc.b    'コンフィグの書き方が変である',0
  1169. e15:    .dc.b    '指定された外部関数のファイルが無い',0
  1170. e16:    .dc.b    '関数の引き数が多いみたいだが',0
  1171. e17:    .dc.b    0    *'配列はもうちょっと待つんだ',0
  1172. e18:    .dc.b    '関数の中に変な引き数があるな',0
  1173. e19:    .dc.b    '外部関数ファイルのパラメータテーブルがおかしい',0
  1174. e20:    .dc.b    '外部関数内でエラーだわ',0
  1175. e21:    .dc.b    'void 型の関数には返り値はないんだよ',0
  1176. e22:    .dc.b    'ステートメントのパラメータの個数が少ない',0
  1177. e23:    .dc.b    'color[ に対応する ] がありません',0
  1178. e24:    .dc.b    'width に指定出来る値は 64 と 96 だけです',0
  1179. e25:    .dc.b    'for 文の書き方がおかしい',0
  1180. e26:    .dc.b    '使用する変数の型が違う',0
  1181. e27:    .dc.b    'next に対応する for がない',0
  1182. e28:    .dc.b    'ネスト構造無しに break, continue はできません',0
  1183. e29:    .dc.b    'if のない then, else です',0
  1184. e30:    .dc.b    'if 文の書き方がおかしい',0
  1185. e31:    .dc.b    '式の型が違う',0
  1186. e32:    .dc.b    'endwhile に対応する while がない',0
  1187. e33:    .dc.b    'until に対応する repeat がない',0
  1188. e34:    .dc.b    '未宣言の関数か配列でないかい',0
  1189. e35:    .dc.b    '配列の宣言に添え字の指定がありませんよ',0
  1190. e36:    .dc.b    '配列の宣言がおかしいですよ',0
  1191. e37:    .dc.b    '配列の添え字が大きすぎます',0
  1192. e38:    .dc.b    '配列の添え字が負の数のようですね',0
  1193. e39:    .dc.b    'func 文の書式に間違いがあるです',0
  1194. e40:    .dc.b    'その関数名はすでに使われております',0
  1195. e41:    .dc.b    '文字列へアクセスするポインタの値がまずいです',0
  1196. e42:    .dc.b    'ネスト構造が閉じていませんね',0
  1197. e43:    .dc.b    'endfunc がありませんです',0
  1198. e44:    .dc.b    'locate のパラメータが無効ですねん',0
  1199. e45:    .dc.b    'endfunc or return に対応する func がありませんです',0
  1200. e46:    .dc.b    'switch の中で continue ですか?',0
  1201. e47:    .dc.b    'case, default, endswitch には switch が必要なんです',0
  1202. e48:    .dc.b    'switch にはやっぱり 1 個は case がないと',0
  1203. e49:    .dc.b    'func ~ endfunc の中に返り値がありません',0
  1204. e50:    .dc.b    'return 文の書き方変',0
  1205. e51:    .dc.b    'using 文のフォーマットがおかしい',0
  1206. e52:    .dc.b    'using 文の後の ',$27,';',$27,' がないです',0
  1207. e53:    .dc.b    'console文のパラメータがまずい',0
  1208. e54:    .dc.b    'break しました',0
  1209. e55:    .dc.b    'input, linput 文の書き方違う',0
  1210. e56:    .dc.b    '配列の添え字の個数が少ないんです',0
  1211. e57:    .dc.b    '配列の添え字の個数が多いんです',0
  1212. e58:    .dc.b    'システム変数にゃ代入出来ません',0
  1213. e59:    .dc.b    '未宣言変数を int 型に割り振ります',0
  1214. e60:    .dc.b    '配列は10次元までしか扱えないんですゴメンナサイ',0
  1215. e61:    .dc.b    'default の後に case, default は置かない方がいいですよね',0
  1216. e62:    .dc.b    'exit 文の書き方変である',0
  1217. e63:    .dc.b    'key に , がありませんね',0
  1218. e64:    .dc.b    'key のパラメーターがまずいです',0
  1219. e65:    .dc.b    '指定されたコンフィグファイルがありません',0
  1220. e66:    .dc.b    '行番号の後には空白をお願いします',0
  1221. e67:    .dc.b    'input系, key があるので、ファンクションキーを本家互換に書き替えた方がいいです',0
  1222. e68:    .dc.b    'エディタを起動出来ません',0
  1223. e69:    .dc.b    '0で割ること出来ません',0
  1224. e70:    .dc.b    'date$, time$ へ変な値を代入しないで下さい',0
  1225. e71:    .dc.b    'screen の画面モードが異常です',0
  1226. e72:    .dc.b    'こBでは使えない命令です',0        * 'GV-RAM は使用中です',0
  1227. e73:    .dc.b    'console の3番目の引数が規定の範囲を超えています',0
  1228. e74:    .dc.b    '関数の引き数の配列の添字が合いませんのぉ',0
  1229. e75:    .dc.b    '引き数の配列の次元が合いません',0
  1230. e76:    .dc.b    'end がありません',0
  1231. e77:    .dc.b    '引き数に配列なんか使えません',0
  1232. e78:    .dc.b    '指定の行番号はありません',0
  1233. e79:    .dc.b    '使える行番号は 0 から 65535 までなんです',0
  1234. e80:    .dc.b    '変な goto',0
  1235. e81:    .dc.b    'そのラベル名はすでに使用されてます',0
  1236. e82:    .dc.b    'label はちゃんと " でくくってください',0
  1237. e83:    .dc.b    'goto で関数ブロックの外に飛びだしちゃいけません',0
  1238. e84:    .dc.b    '配列の添字の大きさには定数しか使えません',0
  1239. e85:    .dc.b    'global な可変長配列は使えません',0
  1240. e86:    .dc.b    'システム変数 info_?? は auto 変数だから イベント関数の中でしか使えません',0
  1241.     .even
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256. **    **    **    **    **    **    **    **    **
  1257.  
  1258.  * kob.cnf を読み込んで評価する。
  1259.  * d5.w = 関数ファイルの個数
  1260. cnf_read:
  1261.     lea.l    _SP上限(a6),a3        * work(外部関数名保存)
  1262.     lea.l    $4000(a3),a5
  1263.  
  1264.  * .cnf 読み込み
  1265.     lea.l    cnf_filename,a2
  1266.     tst.b    (a2)
  1267.     beq    1f
  1268.     lea.l    tmp,a0
  1269.     bsr    cnf_sub0    * 読み込み
  1270.     bge    @f
  1271.     ERROR    65
  1272. 1:
  1273.     lea.l    kobcnf_file(pc),a2    * default name 'kob.cnf'
  1274.     bsr    cnf_sub
  1275.     bmi    help
  1276. @@:
  1277.  
  1278.     moveq    #0,d5        * 関数ファイルの個数
  1279.     moveq    #1,d0
  1280.     move.l    d0,行数
  1281. cr_loop:
  1282.     bsr    first_check_a5
  1283.  * 数字なら            d0 = 0
  1284.  * ファイル終了なら        d0 = -1
  1285.  * その他なら            d0 = そのキャラクタ
  1286.     tst.w    d0
  1287.     beq    cf_err
  1288.     bmi    cf_end
  1289.  
  1290.     cmpi.b    #'*',d0
  1291.     beq    cnf_cont
  1292.  
  1293.     lea.l    _cnfS(pc),a2        * config の命令 list
  1294.     bsr    fc_check_sub
  1295.  * d6 = 命令番号*2 (-1=該当無い)
  1296.     bmi    cf_err
  1297.  
  1298.     bsr    first_check_a5
  1299.     cmpi.b    #'=',(a5)+
  1300.     bne    cf_err
  1301.  
  1302.     bsr    first_check_a5
  1303.     tst.w    d0
  1304.     bmi    cf_err
  1305.  
  1306.     move.w    cc(pc,d6.w),d6
  1307.     jmp    cc(pc,d6.w)
  1308. cc:
  1309.     .dc.w    Func-cc
  1310.     .dc.w    Beep-cc
  1311.     .dc.w    Caps-cc
  1312.     .dc.w    Free-cc
  1313.     .dc.w    Width-cc
  1314.     .dc.w    Warn-cc
  1315.     .dc.w    Extend-cc
  1316.  
  1317. _cnfS:
  1318.     .dc.b    'func',0
  1319.     .dc.b    'beep',0
  1320.     .dc.b    'caps',0
  1321.     .dc.b    'free',0
  1322.     .dc.b    'width',0
  1323.     .dc.b    'warn',0
  1324.     .dc.b    'extend',0
  1325.     .dc.b    0
  1326.  
  1327. _cnfT:
  1328.     .dc.b    'on',0        * 0
  1329.     .dc.b    'off',0
  1330.     .dc.b    'always',0    * 4
  1331.     .dc.b    'ask',0
  1332.     .dc.b    'never',0
  1333.     .dc.b    'auto',0    * 10
  1334.     .dc.b    0
  1335.     .even
  1336.  
  1337. Free:
  1338.     movea.l    a5,a0
  1339.     FPACK    __STOL
  1340.     movea.l    a0,a5
  1341.     tst.w    _FREEMEM(a6)
  1342.     bne    cnf_cont
  1343.     move.w    d0,_FREEMEM(a6)
  1344.     bra    cnf_cont
  1345.  
  1346. Beep:
  1347. Caps:
  1348. Width:
  1349.     bra    cnf_cont    * 飾り
  1350.  
  1351.  
  1352.  
  1353. Warn:
  1354.     moveq    #warnoffF,d2
  1355.     bsr    fc_check_subT
  1356.     beq    WarnOn
  1357.     subq.w    #2,d6
  1358.     bne    cf_err
  1359. WarnOff:
  1360.     bset    d2,d7
  1361.     bra    cnf_cont
  1362. WarnOn:
  1363.     bclr    d2,d7
  1364.     bra    cnf_cont
  1365.  
  1366.  
  1367. Extend:
  1368.     clr.w    d0
  1369.     move.b    (a5)+,d0
  1370.     cmpi.b    #$20,d0
  1371.     bcs    @f
  1372.     ori.b    #$20,d0
  1373.     subi.b    #'a',d0
  1374.     bcs    cf_err
  1375.     cmpi.b    #'z'-'a',d0
  1376.     bhi    cf_err
  1377.     move.b    _ext_flag(pc,d0.w),d0
  1378.     beq    cf_err
  1379.     bset    d0,d7
  1380.     bra    Extend
  1381. @@:
  1382.     subq.l    #1,a5
  1383.     bra    cnf_cont
  1384. _ext_flag:
  1385.     .dc.b    0
  1386.     .dc.b    0,0,fnc_dimF,len_dimF,0    * b,c,d,e
  1387.     .dc.b    0,0,v_initF,0,0        * g,h,i
  1388.     .dc.b    labelF,0,0,0,0        * l
  1389.     .dc.b    0,0,0,0,0
  1390.     .dc.b    0,0,0,0,0
  1391.  
  1392.  
  1393. Func:
  1394.     addq.w    #1,d5        * 関数ファイルの個数 ++
  1395. @@:
  1396.     move.b    (a5)+,d0
  1397.     cmpi.b    #$20,d0
  1398.     bcs    @f
  1399.     move.b    d0,(a3)+
  1400.     bra    @b
  1401. @@:
  1402.     clr.b    (a3)+
  1403.     subq.l    #1,a5
  1404. *    bra    cnf_cont
  1405.  
  1406. cnf_cont:
  1407.     bsr    行末まで飛ばし
  1408.     bra    cr_loop
  1409.  
  1410.  
  1411. cf_end:
  1412.     subq.w    #1,d5        * 関数ファイルの個数 - 1
  1413.     move.w    d5,関数file数
  1414.     rts
  1415.  
  1416. cf_err:
  1417.     clr.b    basic_filename
  1418.     ERROR    14
  1419.  
  1420.  
  1421.  
  1422.  * .cnf の読み込み
  1423. cnf_sub:
  1424.     lea.l    tmp,a0
  1425.     lea.l    起動dir,a1
  1426. @@:
  1427.     move.b    (a1)+,(a0)+
  1428.     bne    @b
  1429.     subq.l    #1,a0
  1430. cnf_sub0:
  1431.     move.b    (a2)+,(a0)+
  1432.     bne    cnf_sub0
  1433.  
  1434.     clr.w    -(sp)
  1435.     pea.l    tmp
  1436.     DOS    _OPEN
  1437.     addq.l    #6,sp
  1438.     tst.l    d0
  1439.     bmi    cnf_ret
  1440.  
  1441.     move.l    #$2000-1,-(sp)    * .cnf size の上限 $2000-1 (問題ないでしょう)
  1442.     move.l    a5,-(sp)
  1443.     move.w    d0,-(sp)
  1444.     DOS    _READ
  1445.     clr.b    (a5,d0.l)        * でりみた
  1446.     DOS    _CLOSE
  1447.     lea.l    10(sp),sp
  1448.     moveq    #0,d0
  1449. cnf_ret:
  1450.     rts
  1451.  
  1452.  
  1453.  
  1454. fc_check_subT:
  1455.     lea.l    _cnfT(pc),a2
  1456. fc_check_sub:
  1457.     moveq    #0,d6
  1458. fc_check2:
  1459.     tst.b    (a2)
  1460.     beq    fc_checkend
  1461.     movea.l    a5,a0
  1462. @@:
  1463.     move.b    (a2)+,d0
  1464.     beq    fc_ok
  1465.     moveq    #$20,d1
  1466.     or.b    (a0)+,d1
  1467.     cmp.b    d1,d0
  1468.     beq    @b
  1469. @@:
  1470.     tst.b    (a2)+        * 次へ
  1471.     bne    @b
  1472.     addq.w    #2,d6
  1473.     bra    fc_check2
  1474. fc_ok:
  1475.     moveq    #$20,d1
  1476.     or.b    (a0),d1        * 英字以外でないと
  1477.     cmpi.b    #'a',d1
  1478.     bcs    @f
  1479.     cmpi.b    #'z',d1
  1480.     bcs    fc_checkend
  1481. @@:
  1482.     movea.l    a0,a5
  1483.     tst.w    d6        * 0 以上
  1484.     rts
  1485. fc_checkend:
  1486.     moveq    #-1,d6
  1487.     rts
  1488.  
  1489.  
  1490.  
  1491. **    **    **    **    **    **    **    **    **
  1492.  
  1493.  * 外部関数読み込みサブ
  1494. func_read:
  1495.     move.w    関数file数,d5
  1496.     move.l    a4,関数list
  1497.     movea.l    a4,a3        * 関数ファイルのリスト
  1498.     move.w    d5,d0
  1499.     bmi    fnc_整理整頓
  1500.     lsl.w    #2,d0
  1501.     lea.l    4(a4,d0.w),a4    * +  4+4*(関数の個数 - 1)
  1502.  
  1503.     lea.l    _SP上限(a6),a2
  1504. fr_loop:
  1505.     lea.l    tmp,a0        * '=' の後ろ
  1506.  
  1507. .ifndef    _DEBUG            * _DEBUG が定義されてなければ
  1508.     lea.l    起動dir,a1    * 起動ディレクトリから探す
  1509. @@:
  1510.     move.b    (a1)+,(a0)+
  1511.     bne    @b
  1512.     subq.l    #1,a0
  1513. .endif
  1514.  
  1515.  
  1516. @@:
  1517.     move.b    (a2)+,(a0)+
  1518.     bne    @b
  1519.     move.b    #'.',-1(a0)
  1520.     move.b    #'f',(a0)+
  1521.     move.b    #'n',(a0)+
  1522.     move.b    #'c',(a0)+
  1523.     clr.b    (a0)
  1524.  
  1525.  
  1526.  
  1527. .ifdef    _DEBUG            * _DEBUG が定義されてると
  1528.     clr.l    -(sp)        * PATH の通ったディレクトリから探す
  1529.     pea.l    $100+tmp
  1530.     pea.l    tmp
  1531.     move.w    #2,-(sp)
  1532.     DOS    _EXEC
  1533.     lea.l    14(sp),sp
  1534.     tst.l    d0
  1535.     bmi    fnc_err
  1536. .endif
  1537.     move.l    mem_last,-(sp)    * limit address
  1538.     move.l    a4,-(sp)
  1539.     pea.l    tmp
  1540.     move.b    #3,(sp)        * X 形式のファイルとして読み込み
  1541.     move.w    #3,-(sp)
  1542.     DOS    _EXEC
  1543.     lea.l    14(sp),sp
  1544.     tst.l    d0
  1545.     ble    fnc_err
  1546.  
  1547.     * 登録
  1548.     move.l    a4,(a3)+
  1549. *    addq.l    #3,d0
  1550. *    andi.b    #$fc,d0        * あんまり関係ないからいらない?
  1551.     adda.l    d0,a4
  1552.  
  1553.     dbra    d5,fr_loop
  1554.  
  1555.  
  1556. fnc_整理整頓:
  1557.  * 読み込みが終了したので、外部関数の整理整頓をする。
  1558.     moveq    #-1,d6        * 関数の個数 - 1
  1559.  
  1560.     movea.l    関数list,a3
  1561.     move.l    a4,関数buf
  1562.     lea.l    _SP上限(a6),a4
  1563.  
  1564.     .xref    standard_init
  1565.     bsr    standard_init
  1566.     .xref    kofunc_init
  1567.     bsr    kofunc_init
  1568.  
  1569.     move.w    関数file数,d5
  1570.     bmi    fnc_end2
  1571. func_init_loop:
  1572.     movea.l    (a3)+,a0
  1573.     move.l    Ftokun(a0),a5
  1574.     movem.l    Fpara(a0),a0-a1
  1575.         * a5 = トークン    テーブルの先頭アドレス
  1576.         * a0 = パラメータ
  1577.         * a1 = 実行アドレス
  1578.     move.w    d5,-(sp)
  1579.     bsr    func_hash
  1580.     move.w    (sp)+,d5
  1581.     dbra    d5,func_init_loop
  1582. fnc_end2:
  1583.     movea.l    関数buf,a4
  1584.     move.w    d6,関数個数
  1585.  
  1586.     lea.l    _SP上限(a6),a3        * とりあえず作った関数テーブル
  1587.     lea.l    外部functable,a5    * 本物の関数テーブルを格納
  1588.     bsr    func_sort
  1589.     rts
  1590.  
  1591. fnc_err:
  1592.     move.w    #-1,関数file数
  1593.     cmpi.w    #$fff8,d0    * メモリが足りない
  1594.     beq    mem_err
  1595.     ERROR    15
  1596.  
  1597.  
  1598.  
  1599.  
  1600.  
  1601.  
  1602.  * a3 から始まる (d6+1) 個のハッシュ値付きのテーブルを a4 に並べ直す。
  1603.  * a5 に参照用テーブルを作る
  1604. func_sort:
  1605.     move.w    d6,d4
  1606.     addq.w    #1,d4
  1607.     lsl.w    #2,d4
  1608.     suba.w    d4,sp
  1609.     movea.l    sp,a0
  1610.     move.w    d6,d0
  1611. @@:
  1612.     move.l    a3,(a0)+
  1613.     lea.l    $10(a3),a3
  1614.     dbra    d0,@b
  1615.  
  1616.  
  1617.     move.w    d6,d2
  1618.     subq.w    #1,d2
  1619.     bmi    fs_loop_end
  1620.     lea.l    4(sp),a3
  1621. fs_loop:
  1622.     movea.l    (a3),a0
  1623.     move.b    1(a0),d0
  1624.     move.w    d6,d5
  1625.     sub.w    d2,d5
  1626.     subq.w    #1,d5
  1627.     movea.l    a3,a2
  1628. @@:
  1629.     movea.l    -(a2),a1
  1630.     cmp.b    1(a1),d0    * hash の下1バイト
  1631.     bcc    @f
  1632.     move.l    a1,4(a2)
  1633.     dbra    d5,@b
  1634.     subq.l    #4,a2
  1635. @@:
  1636.     move.l    a0,4(a2)
  1637.     addq.l    #4,a3
  1638.     dbra    d2,fs_loop
  1639.  
  1640. fs_loop_end:
  1641.  
  1642.     moveq    #0,d0
  1643.     moveq    #-1,d1
  1644.     moveq    #0,d2
  1645.     movea.l    sp,a1
  1646.     clr.w    (a5)+    * 関数buf からのオフセット
  1647.  
  1648. fs_2:
  1649.     movea.l    (a1)+,a0
  1650. @@:
  1651.     cmp.b    1(a0),d0
  1652.     beq    fs_1
  1653.  
  1654.     move.w    d1,(a5)+    * 個数
  1655.     move.w    d2,(a5)+    * 関数buf からのオフセット
  1656.  
  1657.     addq.b    #1,d0
  1658.     moveq    #-1,d1
  1659.     bra    @b
  1660.  
  1661. fs_1:
  1662.     move.l    (a0)+,(a4)+
  1663.     move.l    (a0)+,(a4)+
  1664.     move.l    (a0)+,(a4)+
  1665.     move.l    (a0)+,(a4)+
  1666.     addq.w    #1,d1
  1667.     add.w    #$10,d2
  1668.     dbra    d6,fs_2
  1669.  
  1670.     move.w    d1,(a5)+    * 個数
  1671.     move.w    #$100-2,d1
  1672.     sub.w    d0,d1
  1673.     bmi    fs_3
  1674.     moveq    #-1,d0
  1675. @@:
  1676.     move.l    d0,(a5)+    * 残りを埋める
  1677.     dbra    d1,@b
  1678.  
  1679. fs_3:
  1680.     adda.w    d4,sp
  1681.     rts
  1682.  
  1683.  
  1684.  
  1685.  
  1686.  * (a5) から始まるトークンリストからハッシュ値を計算してテーブルを作る
  1687. func_hash:
  1688.     tst.b    (a5)
  1689.     beq    fi_loop1_end
  1690. fi_loop1:
  1691.     bsr    hash
  1692.  * a2.l = 元の対象の開始アドレス
  1693.  * d4.l = (hash.w)(文字数 - 1)
  1694.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  1695.     move.l    a2,(a4)+    * 名前
  1696.     move.l    (a0)+,(a4)+    * パラメータリストを指すポインタ
  1697.     move.l    (a1)+,(a4)+    * 実行アドレス
  1698.  * おんなじ名前の関数もあるかもしれないが、そのまま登録してまおう
  1699.  * 上から一致を見ていくから、先に登録したものが優先となるはず
  1700.  
  1701.     addq.w    #1,d6
  1702.     addq.l    #1,a5        * $00
  1703.  
  1704.     tst.b    (a5)
  1705.     bne    fi_loop1
  1706. fi_loop1_end:
  1707.     rts
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.  * プログラム全体から 'func' の文字列を探しだし、
  1725.  * 内部関数の宣言なら登録する。
  1726. 内部関数:
  1727.     move.l    a4,内部関数para
  1728.  
  1729.     lea.l    -$10*$400(sp),sp    * 内部関数の個数の上限 1024 (大丈夫……かな?)
  1730.     movea.l    sp,a4        * 内部関数buf_tmp
  1731.     move.l    a4,内部関数buf
  1732.  
  1733.     lea.l    tmp,a0        * func を探すための BM法テーブル
  1734.     move.l    #$04040404,d0
  1735.     moveq    #32/4-1,d1
  1736. @@:
  1737.     move.l    d0,(a0)+
  1738.     dbra    d1,@b
  1739.     move.l    #$05050505,d0
  1740.     moveq    #(256-32)/4-1,d1
  1741. @@:
  1742.     move.l    d0,(a0)+
  1743.     dbra    d1,@b
  1744.  
  1745.     lea.l    tmp,a0
  1746.     move.b    #4,' '(a0)
  1747.     move.b    #3,'f'(a0)
  1748.     move.b    #2,'u'(a0)
  1749.     move.b    #1,'n'(a0)
  1750.     clr.b    'c'(a0)
  1751.  
  1752.     move.w    #-1,内部関数個数
  1753.  
  1754.     addq.l    #4,a5
  1755. search_func_loop:
  1756.     clr.w    d0
  1757.     move.b    (a5),d0
  1758.     move.b    (a0,d0.w),d0
  1759.     bne    func_next
  1760.  
  1761.     moveq    #4+1,d0
  1762.     movea.l    a5,a1
  1763.     cmpi.b    #'n',-(a1)
  1764.     bne    func_next
  1765.     cmpi.b    #'u',-(a1)
  1766.     bne    func_next
  1767.     cmpi.b    #'f',-(a1)
  1768.     bne    func_next
  1769.  
  1770. @@:
  1771.     move.b    -(a1),d1    * 前の文字は空白・行番号を飛ばすと改行 ($a) でなきゃ
  1772.     cmpi.b    #32,d1
  1773.     beq    @b
  1774.     cmpi.b    #9,d1
  1775.     beq    @b
  1776.     cmpi.b    #'9',d1
  1777.     bhi    func_next
  1778.     cmpi.b    #'0',d1
  1779.     bcc    @b
  1780.  
  1781.     cmpi.b    #$a,d1
  1782.     bne    func_next
  1783.  
  1784.     move.b    1(a5),d1    * 次の文字(空白・TAB)
  1785.     cmpi.b    #' ',d1
  1786.     beq    func_hit
  1787.     cmpi.b    #9,d1
  1788.     bne    func_next
  1789. func_hit:
  1790.     movem.l    a0/a2,-(sp)
  1791.     bsr    内部関数登録
  1792.     movem.l    (sp)+,a0/a2
  1793.     moveq    #4,d0
  1794. func_next:
  1795.     adda.w    d0,a5
  1796.     cmpa.l    a2,a5
  1797.     bcs    search_func_loop
  1798.  
  1799.     movea.l    内部関数para,a4
  1800.     move.l    a4,内部関数buf
  1801.     move.w    内部関数個数,d1        * buf_tmp からコピー
  1802.     bmi    1f
  1803.     movea.l    sp,a0
  1804. @@:
  1805.     move.l    (a0)+,(a4)+
  1806.     move.l    (a0)+,(a4)+
  1807.     move.l    (a0)+,(a4)+
  1808.     move.l    (a0)+,(a4)+
  1809.     dbra    d1,@b
  1810. 1:
  1811.     lea.l    $10*$400(sp),sp
  1812.     rts
  1813.  
  1814.  
  1815.  
  1816.  
  1817. 内部関数登録:
  1818.     addq.l    #1,a5
  1819.  * 型を得る(省略なら int )
  1820.     bsr    型getS
  1821.  *         (INT,STR,CHAR,FLOAT)
  1822.  * d1.w  型を返す(  0,  2,   4,    6)
  1823.     move.w    d1,-(sp)
  1824.  
  1825.     bsr    first_check_a5_in_line
  1826.  * ハッシュ値を計算しながら、文字数を数える
  1827.     bsr    hash
  1828.  * a2.l = 元の対象の開始アドレス
  1829.  * d4.l = (hash.w)(文字数-1)
  1830.     tst.w    d4
  1831.     bmi    func文err
  1832.  
  1833.     bsr    statement_check
  1834.  * 一致しなければ    d0 = 0
  1835.     tst.w    d0
  1836.     bne    func_double_def
  1837.  
  1838.     bsr    function_check
  1839.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  1840.     tst.w    d0
  1841.     bne    func_double_def0
  1842.  
  1843.  
  1844.  
  1845.  * 内部関数登録
  1846.     addq.w    #1,内部関数個数
  1847.  
  1848.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  1849.     bsr    名前登録    * a2,d4 破壊
  1850.     move.l    a0,(a4)+    * 名前
  1851.  
  1852.     movea.l    内部関数para,a3
  1853.     move.l    a3,(a4)+    * パラメータリストを指すポインタ
  1854.     clr.l    (a4)+        * 実行アドレス(念のためクリアしとく)
  1855.  
  1856.  
  1857.     cmpi.b    #'(',(a5)+
  1858.     bne    func文err0
  1859.     bsr    first_check_a5_in_line
  1860.     cmpi.b    #')',d0
  1861.     beq    内部関数登録loop_end
  1862.  
  1863. 内部関数登録loop:
  1864.     bsr    first_check_a5_in_line
  1865.     bsr    hash        * 引き数名(今は無視)
  1866.  
  1867.     cmpi.b    #'(',(a5)
  1868.     bne    @f
  1869.         bsr    配列引き数
  1870.         bra    内部関数登録cont
  1871.  
  1872. @@:
  1873.     moveq    #$0,d1        * int引き数
  1874. *    bsr    first_check_a5_in_line
  1875.     cmpi.b    #';',(a5)
  1876.     bne    @f
  1877.  
  1878.     addq.l    #1,a5
  1879.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  1880.  * d0    = 0 省略せず
  1881.  *    = 1 省略
  1882.     bne    func文err0
  1883. @@:
  1884.     move.w    _引き数の型(pc,d1.w),(a3)+
  1885.  
  1886. 内部関数登録cont:
  1887.     bsr    first_check_a5_in_line
  1888.     addq.l    #1,a5
  1889.     cmpi.b    #',',d0
  1890.     beq    内部関数登録loop
  1891.  
  1892.     cmpi.b    #')',d0
  1893.     bne    func文err0
  1894. 内部関数登録loop_end:
  1895.     move.w    (sp)+,d1        * 返り値の型
  1896.     move.w    _返り値の型(pc,d1.w),(a3)+
  1897.     move.l    a3,内部関数para
  1898.     rts
  1899.  
  1900. _引き数の型:
  1901.     .dc.w    $0002,$0008,$0004,$0001
  1902. _返り値の型:
  1903. *    .dc.w    int_ret,str_ret,char_ret,float_ret
  1904.     .dc.w    $8001,$8003,$8002,$8000
  1905.     *            ^^^^^ 新設
  1906.  
  1907.  
  1908.  
  1909. 配列引き数:
  1910.     btst    #fnc_dimF,d7
  1911.     beq    配列引き数err
  1912.  
  1913.     movem.l    d2/d3,-(sp)
  1914.     moveq    #-1,d1        * 次元 - 1
  1915.     moveq    #0,d2        * 添字大きさ指定フラグ
  1916.     lea.l    6(a3),a2    * $8080.w, 型.b, 次元-1.b, 添字flag.w
  1917. @@:
  1918.     addq.l    #1,a5        * '(',','
  1919.     bsr    first_check_a5_in_line
  1920.     cmpi.b    #')',d0
  1921.     beq    2f
  1922.     cmpi.b    #',',d0
  1923.     bne    1f
  1924.         addq.w    #1,d1        * 次元++
  1925.         clr.w    (a2)+        * 一応
  1926.         bra    @b
  1927. 1:
  1928.     bsr    int定数get    * 添字大きさ
  1929.     cmpi.l    #$10000,d0
  1930.     bcc    func文err0
  1931.  
  1932.     addq.w    #1,d1        * 次元++
  1933.     move.w    d0,(a2)+
  1934.     moveq    #$f,d0
  1935.     sub.w    d1,d0
  1936.     bset    d0,d2        * 添字大きさ指定フラグ set
  1937.  
  1938.     bsr    first_check_a5_in_line
  1939.     cmpi.b    #')',d0
  1940.     beq    3f
  1941.     cmpi.b    #',',d0
  1942.     beq    @b
  1943.     bra    func文err0
  1944.  
  1945. 2:
  1946.     addq.w    #1,d1        * 次元++
  1947.     clr.w    (a2)+        * 一応
  1948. 3:
  1949.     addq.l    #1,a5
  1950.     tst.w    d2
  1951.     bne    拡張配列引き数    * 添字大きさ指定フラグが一個でもあれば
  1952.     cmpi.w    #1,d1
  1953.     bhi    拡張配列引き数    * 三次元以上なら
  1954.  
  1955.     beq    @f
  1956.         moveq    #$0020,d2    *普通の1次元
  1957.         bra    1f
  1958. @@:
  1959.         moveq    #$0040,d2    *普通の2次元
  1960. 1:
  1961.     moveq    #$0,d1        * int引き数
  1962.     bsr    first_check_a5_in_line
  1963.     cmpi.b    #';',d0
  1964.     bne    @f
  1965.  
  1966.     addq.l    #1,a5
  1967.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  1968.  * d0    = 0 省略せず
  1969.  *    = 1 省略
  1970.     bne    func文err0
  1971. @@:
  1972.     lea.l    _引き数の型(pc),a0
  1973.     add.w    (a0,d1.w),d2        * 2次元以下配列型指定
  1974.     move.w    d2,(a3)+
  1975.     movem.l    (sp)+,d2/d3
  1976.     rts
  1977.  
  1978.  
  1979. 拡張配列引き数:
  1980.     cmpi.w    #10,d1
  1981.     bcc    func文err0        * 11次元以上
  1982.  
  1983.     move.l    a2,-(sp)
  1984.     move.w    #$8080,(a3)+    * 拡張配列引き数
  1985.  
  1986.     bsr    first_check_a5_in_line
  1987.  
  1988.     moveq    #0,d0        * int
  1989.     cmpi.b    #';',(a5)
  1990.     bne    @f
  1991.     addq.l    #1,a5
  1992.     movem.l    d1/a1,-(sp)
  1993.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  1994.  * d0    = 0 省略せず
  1995.  *    = 1 省略
  1996.     bne    func文err0
  1997.     move.w    _引き数の型2(pc,d1.w),d0
  1998.     movem.l    (sp)+,d1/a1
  1999. @@:
  2000.     or.w    d1,d0
  2001.     move.w    d0,(a3)+    * 型+次元-1
  2002.     move.w    d2,(a3)+    * 添字大きさ指定フラグ
  2003.     movea.l    (sp)+,a3
  2004.     movem.l    (sp)+,d2/d3
  2005.     rts
  2006. _引き数の型2:
  2007.     .dc.w    $0000,$0100,$0200,$8000
  2008.  
  2009.  
  2010.  
  2011.  
  2012. 配列引き数err:
  2013.     bsr    line算出
  2014.     ERRORS    77        * 配列名を表示
  2015. func文err0:
  2016.     movea.l    -$10+4(a4),a2
  2017.     move.w    -$10+2(a4),d4
  2018.     bsr    line算出
  2019.     ERRORS    39        * 関数名を表示
  2020. func文err:
  2021.     bsr    line算出
  2022.     ERROR    39
  2023. func_double_def0:
  2024.     movea.l    -$10+4(a3),a2
  2025.     move.w    -$10+2(a3),d4
  2026. func_double_def:
  2027.     bsr    line算出
  2028.     ERRORS    40
  2029.  
  2030.  * 何行目かを出す
  2031. line算出:
  2032.     move.l    a5,d1
  2033.     sub.l    program_area,d1
  2034.     moveq    #1,d2
  2035. line算出loop:
  2036.     cmpi.b    #$a,-(a5)
  2037.     bne    @f
  2038.     addq.l    #1,d2
  2039. @@:
  2040.     subq.l    #1,d1
  2041.     bne    line算出loop
  2042.     move.l    d2,行数
  2043.     rts
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  * 外部関数のさまざまなルーチンを呼ぶ
  2058. Fルーチン:
  2059.     movem.l    d0-d7/a0-a6,-(sp)
  2060.     moveq    #0,d0
  2061.     move.w    関数file数,d0
  2062.     bmi    no_func_file1
  2063.     *    KH    '関数file数 = ',d0
  2064.     movea.l    関数list,a5
  2065.     *    KH    '関数list = ',a5
  2066. @@:
  2067.     movea.l    (a5)+,a0
  2068.     move.l    (a0,d1.w),a0
  2069.     movem.l    d0/d1/a5,-(sp)
  2070.     jsr    (a0)            * run 実行時の初期化ルーチン
  2071.     movem.l    (sp)+,d0/d1/a5
  2072.     dbra    d0,@b
  2073. no_func_file1:
  2074.     movem.l    (sp)+,d0-d7/a0-a6
  2075.     rts
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.     *    d2  : 4
  2083.     * -4(a2) : 'h:/ko/kob.win',0
  2084.     *   (a2) : '-f ',0
  2085.     *  4(a2) : '640',0
  2086.     *  8(a2) : 'sin.kob',0
  2087.  * コマンドラインの評価
  2088. com_est:
  2089.  
  2090. ce_loop:
  2091.     subq.w    #1,d2
  2092.     beq    help        * プログラム名が現れない
  2093.  
  2094.     movea.l    (a2)+,a0
  2095.  
  2096.     move.b    (a0)+,d0
  2097.     cmpi.b    #'-',d0
  2098.     bne    ce_file
  2099.  
  2100.     moveq    #$20,d0
  2101.     or.b    (a0)+,d0
  2102.     cmpi.b    #'c',d0
  2103.     beq    sw_c
  2104.     cmpi.b    #'e',d0
  2105.     beq    sw_e
  2106.     cmpi.b    #'f',d0
  2107.     beq    sw_f
  2108.     cmpi.b    #'n',d0
  2109.     beq    sw_n
  2110.     bra    help
  2111.  
  2112.  
  2113. sw_arg:
  2114.     tst.b    (a0)
  2115.     bne    @f
  2116.     subq.w    #1,d2
  2117.     beq    sw_help        * オプション引き数がない
  2118.     movea.l    (a2)+,a0
  2119. @@:
  2120.     rts
  2121. sw_help:
  2122.     addq.l    #4,sp
  2123.     bra    help
  2124.  
  2125.  
  2126. sw_n:        * ヘルプ抑制
  2127.     move.w    #1,help抑制する
  2128.     bra    ce_loop
  2129.  
  2130. sw_f:
  2131.     bsr    sw_arg
  2132.     FPACK    __STOL
  2133.     move.w    d0,_FREEMEM(a6)
  2134.     bra    ce_loop
  2135.  
  2136. sw_e:
  2137.     movem.l    EXTENDmask,d1/d3        * OFFmask/ONmask
  2138.     lea.l    _ext_flag(pc),a1
  2139. @@:
  2140.     move.b    (a0)+,d0
  2141.     subi.b    #'A',d0
  2142.     bcs    sw_e_end
  2143.     cmpi.b    #26,d0
  2144.     bcc    sw_e_off
  2145.     move.b    (a1,d0.w),d0
  2146.     beq    help
  2147.     bset    d0,d3        * ONmask
  2148.     bra    @b
  2149. sw_e_off:
  2150.     subi.b    #'a'-'A',d0
  2151.     bcs    help
  2152.     cmpi.b    #26,d0
  2153.     bcc    help
  2154.     move.b    (a1,d0.w),d0
  2155.     beq    help
  2156.     bclr    d0,d1        * OFFmask
  2157.     bra    @b
  2158.  
  2159. sw_e_end:
  2160.     movem.l    d1/d3,EXTENDmask
  2161.     bra    ce_loop
  2162.  
  2163. sw_c:
  2164.     bsr    sw_arg
  2165.     lea.l    cnf_filename,a1
  2166. @@:
  2167.     move.b    (a0)+,(a1)+
  2168.     bne    @b
  2169.     bra    ce_loop
  2170.  
  2171. ce_file:
  2172.     subq.l    #1,a0
  2173.     lea.l    basic_filename,a1
  2174. @@:
  2175.     move.b    (a0)+,(a1)+
  2176.     bne    @b
  2177.     bsr    b_argv展開
  2178.     rts
  2179.  
  2180.  
  2181.  
  2182.  
  2183. b_argv展開:
  2184.     addq.l    #2,a4        * 項目をロングワード境界に
  2185.     move.l    a4,b_argv
  2186.  
  2187.     clr.l    (a4)+            * 次を指す offset  (dummy)
  2188.     move.l    #$0000_00ff,(a4)+    * (次元 - 1)_(データサイズ)
  2189.     move.l    a4,-(sp)
  2190.     addq.l    #2,a4            * 要素数
  2191.  
  2192.     lea.l    _SP上限(a6),a1
  2193.     move.l    a1,-(sp)
  2194.     pea.l    basic_filename
  2195.     DOS    _NAMECK
  2196.     addq.l    #8,sp
  2197.  
  2198.     movea.l    a4,a0
  2199.     bsr    barg_sub        * drive & path
  2200.     lea.l    2+65+_SP上限(a6),a1
  2201.     bsr    barg_sub        * file name
  2202.     lea.l    2+65+19+_SP上限(a6),a1
  2203.     bsr    barg_sub        * ext name
  2204.     lea.l    $100(a4),a4
  2205.     moveq    #0,d1        * 要素数
  2206.  
  2207. barg_loop:
  2208.     subq.w    #1,d2
  2209.     beq    barg_end
  2210.     movea.l    (a2)+,a0
  2211.     movea.l    a4,a1
  2212. @@:
  2213.     move.b    (a0)+,(a1)+
  2214.     bne    @b
  2215.     lea.l    $100(a4),a4
  2216.     addq.w    #1,d1        * 要素数
  2217.     bra    barg_loop
  2218. barg_end:
  2219.     movea.l    (sp)+,a0
  2220.     move.w    d1,(a0)        * b_argv 配列サイズ
  2221.     addq.w    #1,d1
  2222.     move.l    d1,b_argc
  2223.     rts
  2224.  
  2225.  
  2226. barg_sub:
  2227.     move.b    (a1)+,(a0)+
  2228.     bne    barg_sub
  2229.     subq.l    #1,a0
  2230.     rts
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.     .xdef    dec_print
  2241. dec_print:
  2242.     movem.l    d0-d2/a0,-(sp)
  2243.     move.l    4+4*4(sp),d2
  2244.     bmi    dec_minus
  2245.  
  2246.     bsr    DECP
  2247.     move.b    #$20,-(a0)
  2248.     bra    dec_plus
  2249.  
  2250. dec_minus:
  2251.     neg.l    d2
  2252.     bsr    DECP
  2253.     move.b    #'-',-(a0)
  2254. dec_plus:
  2255.     move.l    a0,-(sp)
  2256.     KO_PRINT
  2257.     addq.l    #4,sp
  2258.  
  2259.     movem.l    (sp)+,d0-d2/a0
  2260.     rts
  2261.  
  2262.  
  2263.  
  2264. DECP:
  2265.     lea.l    $100+tmp,a0
  2266.     move.w    #$20_00,-(a0)
  2267.     moveq    #10,d1
  2268. decp2:
  2269.  
  2270.     swap    d2
  2271.     moveq    #0,d0
  2272.     move.w    d2,d0
  2273.     divu    d1,d0
  2274.     beq    decp3
  2275.     move.w    d0,d2
  2276.     swap    d2
  2277.     move.w    d2,d0
  2278.     divu    d1,d0
  2279.     move.w    d0,d2
  2280.     swap    d0
  2281.  
  2282.     addi.b    #$30,d0
  2283.     move.b    d0,-(a0)
  2284.     bra    decp2
  2285.  
  2286. decp3:
  2287.     swap    d2
  2288. decp4:
  2289.     divu    d1,d2
  2290.     swap    d2
  2291.     addi.b    #$30,d2
  2292.     move.b    d2,-(a0)
  2293.     clr.w    d2
  2294.     swap    d2
  2295.     bne    decp4
  2296.  
  2297.     rts
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  * a5 の指す中間言語のアドレスが何行目かを計算して '行数' に返す
  2305.     .xdef    I行数算出
  2306. I行数算出:
  2307.     moveq    #0,d1
  2308.     movea.l    4+中間言語行数,a3
  2309.     move.l    中間言語,a1
  2310. @@:
  2311.     bsr    bufget
  2312.     adda.w    d0,a1
  2313.     addq.w    #1,d1
  2314.     cmpa.l    a5,a1
  2315.     bcs    @b
  2316.     subq.l    #1,d1
  2317.     move.l    d1,行数
  2318.     rts
  2319.  
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  * メモリの最後尾(mem_last)から、 d0.w だけのメモリを確保して、
  2325.  * アドレスを a0に返す
  2326.     .xdef    malloc
  2327. malloc:
  2328.     movea.l    mem_last,a0
  2329.     suba.w    d0,a0
  2330.     move.l    a0,mem_last
  2331.     rts
  2332.  
  2333.  
  2334.  * 鎖状のバッファ(size = CbufSIZE * word )を malloc して、d0.w を書き込む
  2335.  * d1.w/a0-a1 破壊
  2336.     .xdef    buf書込L
  2337. buf書込L:
  2338.     move.l    4(sp),-(sp)
  2339.     swap    d0
  2340.     bsr    buf書込
  2341.     swap    d0
  2342.     bsr    buf書込
  2343.     addq.l    #4,sp
  2344.     rts
  2345.  
  2346.     .xdef    buf書込
  2347. buf書込:
  2348.     movea.l    4(sp),a1
  2349.     addq.w    #1,8(a1)
  2350.     move.w    8(a1),d1
  2351.     andi.w    #CbufSIZE-1,d1
  2352.     bne    3f
  2353.  
  2354.     move.w    d0,d1
  2355.     move.w    #CbufSIZE*2+4,d0
  2356.     bsr    malloc
  2357.     move.w    d1,d0
  2358.     move.w    8(a1),d1
  2359.     bne    1f
  2360.     move.l    a0,4(a1)    * 先頭登録
  2361.     bra    4f
  2362. 1:
  2363.     movea.l    (a1),a1        * 今の鎖の最後尾
  2364.     move.l    a0,(a1)        * 次の鎖へのつなぎ
  2365.     movea.l    4(sp),a1    * もう一回復活
  2366.     bra    4f
  2367.  
  2368. 3:
  2369.     move.l    (a1),a0        * 今の書き込みポインタ
  2370. 4:
  2371.     move.w    d0,(a0)+
  2372.     move.l    a0,(a1)        * 書き込みポインタ登録
  2373.     rts
  2374.  
  2375.  
  2376.  
  2377.  * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
  2378.  * d1 で指されたデータを d0.w に返す
  2379.     .xdef    bufget
  2380. bufget:
  2381.     move.l    a3,-(sp)
  2382.     move.w    d1,d0
  2383. @@:
  2384.     subi.w    #CbufSIZE,d0
  2385.     bcs    @f
  2386.     movea.l    CbufSIZE*2(a3),a3
  2387.     bra    @b
  2388.  
  2389. @@:
  2390.     addi.w    #CbufSIZE,d0
  2391.     add.w    d0,d0
  2392.     move.w    (a3,d0.w),d0
  2393.  
  2394.     movea.l    (sp)+,a3
  2395.     rts
  2396.  
  2397.  
  2398.  * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
  2399.  * d1 で指された位置に d2 を書き込む (d0.w 破壊)
  2400.     .xdef    bufput
  2401. bufput:
  2402.     move.l    a3,-(sp)
  2403.     move.w    d1,d0
  2404. @@:
  2405.     subi.w    #CbufSIZE,d0
  2406.     bcs    @f
  2407.     movea.l    CbufSIZE*2(a3),a3
  2408.     bra    @b
  2409.  
  2410. @@:
  2411.     addi.w    #CbufSIZE,d0
  2412.     add.w    d0,d0
  2413.     move.w    d2,(a3,d0.w)
  2414.  
  2415.     movea.l    (sp)+,a3
  2416.     rts
  2417.  
  2418.  
  2419.     .xdef    bufgetL
  2420. bufgetL:
  2421.     bsr    bufget
  2422.     swap    d0
  2423.     addq.w    #1,d1
  2424.     bsr    bufget
  2425.     subq.w    #1,d1
  2426.     rts
  2427. bufputL:
  2428.     swap    d2
  2429.     bsr    bufput
  2430.     swap    d2
  2431.     addq.w    #1,d1
  2432.     bsr    bufput
  2433.     subq.w    #1,d1
  2434.     rts
  2435.  
  2436.  
  2437.  * 鎖バッファ が連結でなかったら、つなぐ
  2438.     .xdef    chain連結
  2439. chain連結:
  2440.     move.w    8(a1),d0
  2441.     cmpi.w    #CbufSIZE,d0
  2442.     bcs    連結必要無し
  2443.  
  2444.     move.w    d0,d1
  2445.     add.w    d0,d0
  2446.     bsr    malloc
  2447.     movea.l    4(a1),a2
  2448.     move.l    a0,4(a1)
  2449.     move.w    #CbufSIZE,d0
  2450. @@:
  2451.     move.w    (a2)+,(a0)+
  2452.     subq.w    #1,d0
  2453.     dbeq    d1,@b
  2454.     bne    連結終
  2455.     movea.l    (a2),a2
  2456.     move.w    #CbufSIZE,d0
  2457.     dbra    d1,@b
  2458. 連結終:
  2459.     move.l    a0,(a1)
  2460. 連結必要無し:
  2461.     rts
  2462.  
  2463.  
  2464.  
  2465.     .end
  2466.  
  2467.